package ThreadPool.creatpool.createMethod2;

import ThreadPool.creatpool.createMethod1.MyCallableTest.MyCallable;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/*
* 使用工具类
* */
public class Demo3 {
    public static void main(String[] args)
    {
        //使用Executors工具类创建线程池
        //这两方法允许请求队列长度最大为 Integer.MAX_VALUE，可能会堆积大量请求，从而导致 OOM
        ExecutorService pool1 = Executors.newFixedThreadPool(3);//创建固定大小的线程池
        ExecutorService pool2 = Executors.newSingleThreadExecutor();//创建一个单线程化的线程池

        //这两种方法允许创建线程的数量最大为 Integer.MAX_VALUE，可能会堆积大量线程，从而导致 OOM
        ExecutorService pool3 = Executors.newCachedThreadPool();//创建一个可缓存的线程池
        ExecutorService pool4 = Executors.newScheduledThreadPool(3);//创建一个定长线程池，支持定时及周期性任务执行

        Future<String> f1 = pool1.submit(new MyCallable(100));
        Future<String> f2 = pool1.submit(new MyCallable(200));
        Future<String> f3 = pool1.submit(new MyCallable(300));
        Future<String> f4 = pool1.submit(new MyCallable(400));
        try {
            System.out.println(f1.get());
            System.out.println(f2.get());
            System.out.println(f3.get());
            System.out.println(f4.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关闭线程池
        pool1.shutdown();
        pool2.shutdown();
    }
}
/*
* 需要注意这种方式创建的线程池，在大型并发系统中，不建议使用，因为线程可能会大量堆积，导致OOM
* */